home *** CD-ROM | disk | FTP | other *** search
/ Programming Microsoft Visual Basic .NET / Programming Microsoft Visual Basic .NET (Microsoft Press)(X08-78517)(2002).bin / 21 adonet disconnected / adonetdisconnected / datasetform.vb < prev    next >
Text File  |  2002-03-16  |  24KB  |  545 lines

  1. Public Class DataSetForm
  2.     Inherits System.Windows.Forms.Form
  3.  
  4. #Region " Windows Form Designer generated code "
  5.  
  6.     Public Sub New()
  7.         MyBase.New()
  8.  
  9.         'This call is required by the Windows Form Designer.
  10.         InitializeComponent()
  11.  
  12.         'Add any initialization after the InitializeComponent() call
  13.  
  14.     End Sub
  15.  
  16.     'Form overrides dispose to clean up the component list.
  17.     Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
  18.         If disposing Then
  19.             If Not (components Is Nothing) Then
  20.                 components.Dispose()
  21.             End If
  22.         End If
  23.         MyBase.Dispose(disposing)
  24.     End Sub
  25.     Friend WithEvents btnCreateTable As System.Windows.Forms.Button
  26.     Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
  27.     Friend WithEvents btnUppercase As System.Windows.Forms.Button
  28.     Friend WithEvents btnSelect As System.Windows.Forms.Button
  29.     Friend WithEvents btnDataView As System.Windows.Forms.Button
  30.     Friend WithEvents btnRelations As System.Windows.Forms.Button
  31.     Friend WithEvents DataGrid2 As System.Windows.Forms.DataGrid
  32.     Friend WithEvents btnConstraints As System.Windows.Forms.Button
  33.     Friend WithEvents btnSaveXml As System.Windows.Forms.Button
  34.     Friend WithEvents btnEvents As System.Windows.Forms.Button
  35.  
  36.     'Required by the Windows Form Designer
  37.     Private components As System.ComponentModel.Container
  38.  
  39.     'NOTE: The following procedure is required by the Windows Form Designer
  40.     'It can be modified using the Windows Form Designer.  
  41.     'Do not modify it using the code editor.
  42.     <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
  43.         Me.btnRelations = New System.Windows.Forms.Button()
  44.         Me.btnSelect = New System.Windows.Forms.Button()
  45.         Me.btnCreateTable = New System.Windows.Forms.Button()
  46.         Me.DataGrid2 = New System.Windows.Forms.DataGrid()
  47.         Me.DataGrid1 = New System.Windows.Forms.DataGrid()
  48.         Me.btnConstraints = New System.Windows.Forms.Button()
  49.         Me.btnUppercase = New System.Windows.Forms.Button()
  50.         Me.btnDataView = New System.Windows.Forms.Button()
  51.         Me.btnSaveXml = New System.Windows.Forms.Button()
  52.         Me.btnEvents = New System.Windows.Forms.Button()
  53.         CType(Me.DataGrid2, System.ComponentModel.ISupportInitialize).BeginInit()
  54.         CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
  55.         Me.SuspendLayout()
  56.         '
  57.         'btnRelations
  58.         '
  59.         Me.btnRelations.Location = New System.Drawing.Point(16, 256)
  60.         Me.btnRelations.Name = "btnRelations"
  61.         Me.btnRelations.Size = New System.Drawing.Size(112, 40)
  62.         Me.btnRelations.TabIndex = 0
  63.         Me.btnRelations.Text = "Create a Relation"
  64.         '
  65.         'btnSelect
  66.         '
  67.         Me.btnSelect.Location = New System.Drawing.Point(16, 160)
  68.         Me.btnSelect.Name = "btnSelect"
  69.         Me.btnSelect.Size = New System.Drawing.Size(112, 40)
  70.         Me.btnSelect.TabIndex = 0
  71.         Me.btnSelect.Text = "Select method"
  72.         '
  73.         'btnCreateTable
  74.         '
  75.         Me.btnCreateTable.Location = New System.Drawing.Point(16, 16)
  76.         Me.btnCreateTable.Name = "btnCreateTable"
  77.         Me.btnCreateTable.Size = New System.Drawing.Size(112, 40)
  78.         Me.btnCreateTable.TabIndex = 0
  79.         Me.btnCreateTable.Text = "Create DataTables"
  80.         '
  81.         'DataGrid2
  82.         '
  83.         Me.DataGrid2.AlternatingBackColor = System.Drawing.Color.LightGray
  84.         Me.DataGrid2.Anchor = (((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
  85.                     Or System.Windows.Forms.AnchorStyles.Left) _
  86.                     Or System.Windows.Forms.AnchorStyles.Right)
  87.         Me.DataGrid2.BackColor = System.Drawing.Color.DarkGray
  88.         Me.DataGrid2.CaptionBackColor = System.Drawing.Color.White
  89.         Me.DataGrid2.CaptionFont = New System.Drawing.Font("Verdana", 10!)
  90.         Me.DataGrid2.CaptionForeColor = System.Drawing.Color.Navy
  91.         Me.DataGrid2.DataMember = ""
  92.         Me.DataGrid2.ForeColor = System.Drawing.Color.Black
  93.         Me.DataGrid2.GridLineColor = System.Drawing.Color.Black
  94.         Me.DataGrid2.GridLineStyle = System.Windows.Forms.DataGridLineStyle.None
  95.         Me.DataGrid2.HeaderBackColor = System.Drawing.Color.Silver
  96.         Me.DataGrid2.HeaderForeColor = System.Drawing.Color.Black
  97.         Me.DataGrid2.LinkColor = System.Drawing.Color.Navy
  98.         Me.DataGrid2.Location = New System.Drawing.Point(144, 224)
  99.         Me.DataGrid2.Name = "DataGrid2"
  100.         Me.DataGrid2.ParentRowsBackColor = System.Drawing.Color.White
  101.         Me.DataGrid2.ParentRowsForeColor = System.Drawing.Color.Black
  102.         Me.DataGrid2.SelectionBackColor = System.Drawing.Color.Navy
  103.         Me.DataGrid2.SelectionForeColor = System.Drawing.Color.White
  104.         Me.DataGrid2.Size = New System.Drawing.Size(488, 160)
  105.         Me.DataGrid2.TabIndex = 2
  106.         '
  107.         'DataGrid1
  108.         '
  109.         Me.DataGrid1.AlternatingBackColor = System.Drawing.Color.LightGray
  110.         Me.DataGrid1.Anchor = (((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
  111.                     Or System.Windows.Forms.AnchorStyles.Left) _
  112.                     Or System.Windows.Forms.AnchorStyles.Right)
  113.         Me.DataGrid1.BackColor = System.Drawing.Color.DarkGray
  114.         Me.DataGrid1.CaptionBackColor = System.Drawing.Color.White
  115.         Me.DataGrid1.CaptionFont = New System.Drawing.Font("Verdana", 10!)
  116.         Me.DataGrid1.CaptionForeColor = System.Drawing.Color.Navy
  117.         Me.DataGrid1.DataMember = ""
  118.         Me.DataGrid1.ForeColor = System.Drawing.Color.Black
  119.         Me.DataGrid1.GridLineColor = System.Drawing.Color.Black
  120.         Me.DataGrid1.GridLineStyle = System.Windows.Forms.DataGridLineStyle.None
  121.         Me.DataGrid1.HeaderBackColor = System.Drawing.Color.Silver
  122.         Me.DataGrid1.HeaderForeColor = System.Drawing.Color.Black
  123.         Me.DataGrid1.LinkColor = System.Drawing.Color.Navy
  124.         Me.DataGrid1.Location = New System.Drawing.Point(144, 16)
  125.         Me.DataGrid1.Name = "DataGrid1"
  126.         Me.DataGrid1.ParentRowsBackColor = System.Drawing.Color.White
  127.         Me.DataGrid1.ParentRowsForeColor = System.Drawing.Color.Black
  128.         Me.DataGrid1.SelectionBackColor = System.Drawing.Color.Navy
  129.         Me.DataGrid1.SelectionForeColor = System.Drawing.Color.White
  130.         Me.DataGrid1.Size = New System.Drawing.Size(488, 200)
  131.         Me.DataGrid1.TabIndex = 2
  132.         '
  133.         'btnConstraints
  134.         '
  135.         Me.btnConstraints.Location = New System.Drawing.Point(16, 304)
  136.         Me.btnConstraints.Name = "btnConstraints"
  137.         Me.btnConstraints.Size = New System.Drawing.Size(112, 40)
  138.         Me.btnConstraints.TabIndex = 0
  139.         Me.btnConstraints.Text = "Add constraints"
  140.         '
  141.         'btnUppercase
  142.         '
  143.         Me.btnUppercase.Location = New System.Drawing.Point(16, 64)
  144.         Me.btnUppercase.Name = "btnUppercase"
  145.         Me.btnUppercase.Size = New System.Drawing.Size(112, 40)
  146.         Me.btnUppercase.TabIndex = 0
  147.         Me.btnUppercase.Text = "Convert to UpperCase"
  148.         '
  149.         'btnDataView
  150.         '
  151.         Me.btnDataView.Location = New System.Drawing.Point(16, 208)
  152.         Me.btnDataView.Name = "btnDataView"
  153.         Me.btnDataView.Size = New System.Drawing.Size(112, 40)
  154.         Me.btnDataView.TabIndex = 0
  155.         Me.btnDataView.Text = "Create a DataView"
  156.         '
  157.         'btnSaveXml
  158.         '
  159.         Me.btnSaveXml.Location = New System.Drawing.Point(16, 352)
  160.         Me.btnSaveXml.Name = "btnSaveXml"
  161.         Me.btnSaveXml.Size = New System.Drawing.Size(112, 40)
  162.         Me.btnSaveXml.TabIndex = 0
  163.         Me.btnSaveXml.Text = "Save as Xml"
  164.         '
  165.         'btnEvents
  166.         '
  167.         Me.btnEvents.Location = New System.Drawing.Point(16, 112)
  168.         Me.btnEvents.Name = "btnEvents"
  169.         Me.btnEvents.Size = New System.Drawing.Size(112, 40)
  170.         Me.btnEvents.TabIndex = 0
  171.         Me.btnEvents.Text = "DataEvents Events"
  172.         '
  173.         'DataSetForm
  174.         '
  175.         Me.AutoScaleBaseSize = New System.Drawing.Size(7, 17)
  176.         Me.ClientSize = New System.Drawing.Size(648, 397)
  177.         Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.btnEvents, Me.btnSaveXml, Me.btnConstraints, Me.DataGrid2, Me.btnRelations, Me.btnDataView, Me.btnSelect, Me.btnUppercase, Me.DataGrid1, Me.btnCreateTable})
  178.         Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 11!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
  179.         Me.Name = "DataSetForm"
  180.         Me.Text = "Disconnected DataSet"
  181.         CType(Me.DataGrid2, System.ComponentModel.ISupportInitialize).EndInit()
  182.         CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
  183.         Me.ResumeLayout(False)
  184.  
  185.     End Sub
  186.  
  187. #End Region
  188.  
  189.     ' This is at the form level, to be shared among all procedures.
  190.     Dim ds As New DataSet()
  191.  
  192.     Private Sub btnCreateTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreateTable.Click
  193.  
  194.         ' --- Define the Employees table ---
  195.  
  196.         ' Create a table, set its initial capacity and case sensitiveness.
  197.         Dim dtEmp As New DataTable("Employees")
  198.         dtEmp.MinimumCapacity = 100
  199.         dtEmp.CaseSensitive = False
  200.  
  201.         ' Create all columns.
  202.         ' You can create a DataColumn and then add it to the Columns collection.
  203.         Dim dcFName As New DataColumn("FirstName", GetType(String))
  204.         dtEmp.Columns.Add(dcFName)
  205.         ' Or you can create an implicit DataColumn with the Columns.Add method.
  206.         dtEmp.Columns.Add("LastName", GetType(String))
  207.         dtEmp.Columns.Add("BirthDate", GetType(Date))
  208.  
  209.         ' When you have to set additional properties, you can use an explicit
  210.         ' DataColumn object, or you can use a With block.
  211.         With dtEmp.Columns.Add("HomeAddress", GetType(String))
  212.             .MaxLength = 100
  213.         End With
  214.         ' (When you must set only one property you can be even more concise,
  215.         '  even though the result isn't very readable.)
  216.         dtEmp.Columns.Add("City", GetType(String)).MaxLength = 20
  217.  
  218.         ' Create a calculated column, by passing setting the Expression
  219.         ' property or passing it as the 3rd argument to the Add method.
  220.         dtEmp.Columns.Add("CompleteName", GetType(String), "FirstName + ' ' + LastName")
  221.  
  222.         ' Create an ID column.
  223.         Dim dcEmpId As New DataColumn("EmpId", GetType(Integer))
  224.         dcEmpId.AutoIncrement = True        ' Make it autoincrement.
  225.         dcEmpId.AutoIncrementSeed = 1
  226.         dcEmpId.AllowDBNull = False         ' Default is True.
  227.         dcEmpId.Unique = True
  228.         dtEmp.Columns.Add(dcEmpId)          ' Add to Columns collection.
  229.  
  230.         ' Make it the primary key.
  231.         Dim pkCols() As DataColumn = {dcEmpId}
  232.         dtEmp.PrimaryKey = pkCols
  233.         ' (You can also use a more concise form, as follows:)
  234.         dtEmp.PrimaryKey = New DataColumn() {dcEmpId}
  235.  
  236.         ' This is a foreign key, but we haven't created the other table yet.
  237.         dtEmp.Columns.Add("DeptId", GetType(Integer))
  238.  
  239.         ' Add the DataTable to the DataSet.
  240.         ds.Tables.Add(dtEmp)
  241.  
  242.         ' Show the result in the DataGrid.
  243.         DataGrid2.DataSource = dtEmp
  244.  
  245.         ' -- fill the Employees table
  246.  
  247.         ' Create a new row with same schema.
  248.         Dim dr As DataRow = dtEmp.NewRow()
  249.         ' Set all the columns.
  250.         dr("FirstName") = "Joe"
  251.         dr("LastName") = "Doe"
  252.         dr("BirthDate") = #1/15/1955#
  253.         dr("HomeAddress") = "1234 A Street"
  254.         dr("City") = "Los Angeles"
  255.         dr("DeptId") = 1
  256.  
  257.         ' Add to the Rows collection.
  258.         dtEmp.Rows.Add(dr)
  259.  
  260.         dr = dtEmp.NewRow()
  261.         ' Set all the columns.
  262.         dr("FirstName") = "Ann"
  263.         dr("LastName") = "Doe"
  264.         dr("BirthDate") = #1/15/1955#
  265.         dr("HomeAddress") = "1234 A Street"
  266.         dr("City") = "Los Angeles"
  267.         dr("DeptId") = 1
  268.         dtEmp.Rows.InsertAt(dr, 0)
  269.  
  270.         ' Read a semicolon-delimited text file into a DataTable.
  271.  
  272.         ' IMPORTANT: this works only if you copy the Employees.Dat
  273.         ' file from the main project's directory to the BIN subdirectory
  274.  
  275.         ' Open the file, read its contents.
  276.         Dim sr As New System.IO.StreamReader("employees.dat")
  277.         Dim fileText As String = sr.ReadToEnd
  278.         sr.Close()
  279.  
  280.         ' This regular expression defines a row of elements, and assigns a name
  281.         ' to each group (that is, a field in the text row).
  282.         Dim re As New System.Text.RegularExpressions.Regex("""(?<fname>[^""]+)"";""(?<lname>[^""]+)"";(?<bdate>[^;]+);""(?<addr>[^""]+)"";""(?<city>[^""]+)""")
  283.         Dim ma As System.Text.RegularExpressions.Match
  284.  
  285.         dtEmp.BeginLoadData()
  286.         For Each ma In re.Matches(fileText)
  287.             ' A new line has been found, so add a row to the table.
  288.             ' Create an array of values and add it in one operation
  289.             Dim values() As Object = {ma.Groups("fname").Value, ma.Groups("lname").Value, _
  290.                 ma.Groups("bdate").Value, ma.Groups("addr").Value, ma.Groups("city").Value}
  291.             dtEmp.LoadDataRow(values, True)
  292.         Next
  293.         dtEmp.EndLoadData()
  294.  
  295.         ' --- create the Department table
  296.  
  297.         ' Create the Departments table
  298.         Dim dtDept As New DataTable("Departments")
  299.  
  300.         ' The DeptId file must be unique.
  301.         With dtDept.Columns.Add("DeptId", GetType(Integer))
  302.             .Unique = True
  303.         End With
  304.         ' The department Name must be unique as well.
  305.         With dtDept.Columns.Add("Name", GetType(String))
  306.             .MaxLength = 50
  307.             .Unique = True
  308.         End With
  309.         ' Make dtDept the primary key of the table.
  310.         dtDept.PrimaryKey = New DataColumn() {dtDept.Columns("DeptId")}
  311.  
  312.         ' Add to the DataSet.
  313.         ds.Tables.Add(dtDept)
  314.  
  315.         ' Add a few rows.
  316.         Dim deptValues() As Object = {1, "Sales"}
  317.         dtDept.LoadDataRow(deptValues, True)
  318.         ' You can do the same in just one statement.
  319.         dtDept.LoadDataRow(New Object() {2, "Tech Support"}, True)
  320.         dtDept.LoadDataRow(New Object() {3, "Marketing"}, True)
  321.  
  322.         ' Ensure that all Employees are associated to a department.
  323.         Dim i As Integer
  324.         For i = 0 To dtEmp.Rows.Count - 1
  325.             ' Assign a DeptId value in the range 1-3.
  326.             dtEmp.Rows(i).Item("DeptId") = CInt((i Mod 3) + 1)
  327.         Next
  328.         ds.AcceptChanges()
  329.  
  330.         ' show result in first grid
  331.         DataGrid1.DataSource = dtDept
  332.     End Sub
  333.  
  334.     ' convert some fields to uppercase
  335.  
  336.     Private Sub btnUppercase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUppercase.Click
  337.         ' Get a reference to the Employees table.
  338.         Dim dtEmp As DataTable = ds.Tables("Employees")
  339.  
  340.         Dim dr As DataRow
  341.         For Each dr In dtEmp.Rows
  342.             dr("FirstName") = dr("FirstName").ToString.ToUpper
  343.             dr("LastName") = dr("LastName").ToString.ToUpper
  344.         Next
  345.     End Sub
  346.  
  347.     Private Sub btnEvents_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEvents.Click
  348.         ' Demonstrate how to deal with events from Employees table.
  349.         DataTable = ds.Tables(0)
  350.     End Sub
  351.  
  352.     Dim WithEvents DataTable As DataTable
  353.  
  354.     ' All the DataTable event handlers -------
  355.  
  356.     Private Sub DataTable_ColumnChanging(ByVal sender As Object, ByVal e As System.Data.DataColumnChangeEventArgs) Handles DataTable.ColumnChanging
  357.         Dim dt As DataTable = CType(sender, DataTable)
  358.         Debug.WriteLine("Changing Column " & e.Column.ColumnName & " to " & e.ProposedValue.ToString)
  359.  
  360.         ' Show how you can reject a change in a column
  361.         If e.Column.ColumnName = "BirthDate" Then
  362.             If CDate(e.ProposedValue) > Date.Now Then
  363.                 'Throw New ArgumentException("Invalid birth date value")
  364.                 e.Row.SetColumnError(e.Column.ColumnName, "Invalid birth date value")
  365.             End If
  366.         End If
  367.     End Sub
  368.  
  369.     Private Sub DataTable_ColumnChanged(ByVal sender As Object, ByVal e As System.Data.DataColumnChangeEventArgs) Handles DataTable.ColumnChanged
  370.         Dim dt As DataTable = CType(sender, DataTable)
  371.         Debug.WriteLine("Changed Column " & e.Column.ColumnName & " to " & e.Row(e.Column.ColumnName).ToString)
  372.     End Sub
  373.  
  374.     Private Sub DataTable_RowChanging(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs) Handles DataTable.RowChanging
  375.         Dim dt As DataTable = CType(sender, DataTable)
  376.         Debug.WriteLine("Changing Row (" & e.Action.ToString & ")")
  377.  
  378.         If e.Row("FirstName").ToString = "" And e.Row("LastName").ToString = "" Then
  379.             'Throw New ArgumentException("FirstName and LastName can't be empty")
  380.             e.Row.RowError = "First and last name can't be both null"
  381.         End If
  382.     End Sub
  383.  
  384.     Private Sub DataTable_RowChanged(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs) Handles DataTable.RowChanged
  385.         Dim dt As DataTable = CType(sender, DataTable)
  386.         Debug.WriteLine("Changed Row (" & e.Action.ToString & ")")
  387.     End Sub
  388.  
  389.     Private Sub DataTable_RowDeleting(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs) Handles DataTable.RowDeleting
  390.         Dim dt As DataTable = CType(sender, DataTable)
  391.         Debug.WriteLine("Deleting Row")
  392.     End Sub
  393.  
  394.     Private Sub DataTable_RowDeleted(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs) Handles DataTable.RowDeleted
  395.         Dim dt As DataTable = CType(sender, DataTable)
  396.         Debug.WriteLine("Deleted Row")
  397.     End Sub
  398.  
  399.     ' demonstrates the DataTable.Select method
  400.  
  401.     Private Sub btnSelect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelect.Click
  402.         ' Get a reference to the Employees table.
  403.         Dim dtEmp As DataTable = ds.Tables("Employees")
  404.  
  405.         ' Copy only the structure of the Employees table in the new table.
  406.         Dim newDt As DataTable = dtEmp.Clone()
  407.         newDt.TableName = "YoungEmployees"
  408.  
  409.         ' Select a subset of all employees, sorted on their names.
  410.         Dim drows() As DataRow = dtEmp.Select("DeptId IN (2,3)", "LastName, FirstName")
  411.         ' Import the array of DataRows into the new table.
  412.         Dim dr As DataRow
  413.         For Each dr In drows
  414.             newDt.ImportRow(dr)
  415.         Next
  416.  
  417.         ' Now show the new table.
  418.         DataGrid2.DataSource = newDt
  419.     End Sub
  420.  
  421.     ' demonstrate the DataView object
  422.  
  423.     Private Sub btnDataView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDataView.Click
  424.         ' Get a reference to the Employees table.
  425.         Dim dtEmp As DataTable = ds.Tables("Employees")
  426.  
  427.         ' Create a dataview on this table.
  428.         Dim dv As New DataView(dtEmp)
  429.         ' Set its filter and sort properties.
  430.         dv.RowFilter = "BirthDate >= #1/1/1960#"
  431.         dv.Sort = "LastName, FirstName"
  432.  
  433.         ' Display the dataview in a non-editable DataGrid.
  434.         dv.AllowEdit = False
  435.         DataGrid2.DataSource = dv
  436.     End Sub
  437.  
  438.     Private Sub btnRelations_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRelations.Click
  439.         ' Get a reference to the Employees and Department tables.
  440.         Dim dtEmp As DataTable = ds.Tables("Employees")
  441.         Dim dtDept As DataTable = ds.Tables("Departments")
  442.  
  443.         ' Now we can create the relation between the two tables.
  444.         Dim relDeptEmp As New DataRelation("DeptEmp", dtDept.Columns("DeptId"), dtEmp.Columns("DeptId"))
  445.         ds.Relations.Add(relDeptEmp)
  446.  
  447.         ' Display the names of the employees in the first department.
  448.         Dim drEmployees() As DataRow = dtDept.Rows(0).GetChildRows("DeptEmp")
  449.         Dim drEmp As DataRow
  450.         For Each drEmp In drEmployees
  451.             Debug.WriteLine(drEmp("CompleteName"))
  452.         Next
  453.  
  454.         ' Display the number of employees in each department.
  455.         Dim dr As DataRow
  456.         For Each dr In dtDept.Rows
  457.             Debug.WriteLine(dr("Name").ToString & ", " & _
  458.                 dr.GetChildRows("DeptEmp").Length.ToString)
  459.         Next
  460.  
  461.         ' This statement returns the name of the department in the first employee.
  462.         Dim drDepartment As DataRow = dtEmp.Rows(0).GetParentRow("DeptEmp")
  463.  
  464.         ' Add a calculated column to the Departments table
  465.         ' that returns the number of employees for each department
  466.         dtDept.Columns.Add("EmployeesCount", GetType(Integer), "Count(Child(DeptEmp).EmpID)")
  467.  
  468.         ' Add a new Bossid column to the Departments table, and fill it with the 
  469.         ' ID of the first 3 employees.
  470.         dtDept.Columns.Add("BossId", GetType(Integer))
  471.         Dim i As Integer
  472.         For i = 0 To dtDept.Rows.Count - 1
  473.             dtDept.Rows(i)("BossId") = dtEmp.Rows(i)("EmpId")
  474.         Next
  475.         dtDept.AcceptChanges()
  476.  
  477.         ' Create another relation between the Departments and Employees table.
  478.         ds.Relations.Add("DeptBoss", dtEmp.Columns("EmpId"), dtDept.Columns("BossId"))
  479.  
  480.         ' Add a calcualted column to the Departments table that returns the boss's name.
  481.         dtDept.Columns.Add("BossName", GetType(String), "Parent(DeptBoss).CompleteName")
  482.  
  483.         DataGrid1.DataSource = dtDept
  484.  
  485.     End Sub
  486.  
  487.     ' create constraints
  488.  
  489.     Private Sub btnConstraints_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConstraints.Click
  490.         ' Get a reference to the Employees and Department tables.
  491.         Dim dtEmp As DataTable = ds.Tables("Employees")
  492.         Dim dtDept As DataTable = ds.Tables("Departments")
  493.  
  494.         ' Add a unique constraint on the (LastName, FirstName) column combination.
  495.  
  496.         ' Prepare the array of involved DataColumn objects.
  497.         Dim cols() As DataColumn = {dtEmp.Columns("LastName"), _
  498.             dtEmp.Columns("FirstName")}
  499.         ' Create the UniqueConstraint object.
  500.         Dim uc As New UniqueConstraint("UniqueName", cols)
  501.         ' Add it to the table's Constraints collection.
  502.         dtEmp.Constraints.Add(uc)
  503.  
  504.         ' Attempt to create duplicate names.
  505.         Try
  506.             ' Add a new record that contains duplicated values in (LastName, FirstName)
  507.             Dim dr As DataRow = dtEmp.NewRow
  508.             dr("FirstName") = dtEmp.Rows(0)("FirstName")
  509.             dr("LastName") = dtEmp.Rows(0)("LastName")
  510.             dr("DeptId") = 1
  511.             dtEmp.Rows.Add(dr)
  512.         Catch ex As Exception
  513.             MessageBox.Show(ex.Message, "Unique constraint violation", MessageBoxButtons.OK, MessageBoxIcon.Error)
  514.         End Try
  515.  
  516.         ' Create a foreign key constraint
  517.  
  518.         If Not (ds.Relations("DeptEmp") Is Nothing) Then
  519.             MessageBox.Show("You can't add a constraint after a relatin on the same columns")
  520.             Exit Sub
  521.         End If
  522.  
  523.         Dim fkrelDeptEmp As New ForeignKeyConstraint("FKDeptEmp", dtDept.Columns("DeptId"), dtEmp.Columns("DeptId"))
  524.         dtEmp.Constraints.Add(fkrelDeptEmp)
  525.  
  526.         fkrelDeptEmp.DeleteRule = Rule.SetNull
  527.         fkrelDeptEmp.UpdateRule = Rule.Cascade
  528.         fkrelDeptEmp.AcceptRejectRule = AcceptRejectRule.None
  529.     End Sub
  530.  
  531.     ' save the DataSet to XML
  532.  
  533.     Private Sub btnSaveXml_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveXml.Click
  534.         'ds.Relations("DeptEmp").Nested = True
  535.  
  536.         With ds.Tables("Employees")
  537.             .Namespace = "www.vb2themax.com"
  538.             .Prefix = "emp"
  539.         End With
  540.  
  541.         ds.WriteXml("c:\dataset.xml")
  542.     End Sub
  543.  
  544. End Class
  545.